home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994…tember: Reference Library / Dev.CD Sep 94.toast / Periodicals / develop / develop Issue 16 / develop 16 code / CollaboDraw / draw.mailer.window.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-24  |  14.1 KB  |  620 lines  |  [TEXT/MPS ]

  1. /*-------------------------------------------------------------------------------------
  2.  *
  3.  * Simple Sample PowerTalk Application Framework
  4.  *
  5.  * ©1991-1993 Apple Computer
  6.  *
  7.  -------------------------------------------------------------------------------------*/
  8. /*
  9.  * draw.mailer.window.c -- mailer window class
  10.  *
  11.  * change history:
  12.  *
  13.  * SJF        08/23/93        1.0f1        update to final headers, fix comments
  14.  * SJF        04/21/93        1.0b2        update to b2
  15.  * SJF        03/01/93        1.0b1        added digital signatures
  16.  * SJF        02/09/93        1.0b1        update to b1
  17.  * SJF        10/13/92        1.0d4        update to a11
  18.  * SJF        09/09/92        1.0d3        update to a9
  19.  * SJF        05/07/92        1.0d2        update to a6
  20.  * SJF        11/06/91        1.0d1        initial coding
  21.  *
  22.  */
  23.  
  24. #ifndef __TYPES__
  25. #include <Types.h>
  26. #endif
  27.  
  28. #ifndef __QUICKDRAW__
  29. #include <QuickDraw.h>
  30. #endif
  31.  
  32. #ifndef __WINDOWS__
  33. #include <Windows.h>
  34. #endif
  35.  
  36. #ifndef __MENUS__
  37. #include <Menus.h>
  38. #endif
  39.  
  40. #ifndef __OCESTANDARDMAIL__
  41. #include <OCEStandardMail.h>
  42. #endif
  43.  
  44. #ifndef __OCEERRORS__
  45. #include <OCEErrors.h>
  46. #endif
  47.  
  48. #include "const.h"
  49. #include "strconst.h"
  50. #include "mytypes.h"
  51. #include "globals.h"
  52. #include "utils.h"
  53. #include "windowstuff.h"
  54. #include "mymenus.h"
  55. #include "mystandardmail.h"
  56. #include "windutils.h"
  57.  
  58. #include "base.window.h"
  59. #include "draw.window.h"
  60. #include "draw.mailer.window.h"
  61.  
  62. /* instantiate a new draw mailer window */
  63.  
  64. WindowPtr DMailerMakeWindow(Rect *wRect,StringPtr title,Boolean visible,short wdefProc,
  65.                             Boolean goAwayFlag)
  66. {
  67.     WInfoPtr infoPtr;
  68.     WindowPtr theWindow;
  69.     char hState;
  70.     Point topLeft = {0,0};
  71.     short mWidth,contHeight,expHeight;
  72.     OSErr err;
  73.     
  74.     theWindow = BaseMakeWindow(wRect,title,visible,wdefProc,goAwayFlag);
  75.     SetWindowKind(theWindow,kDrawMailerWindow);
  76.     
  77.     infoPtr = BeginWindowAccess(theWindow,&hState);
  78.     
  79.     SetDMailerMethods(infoPtr);
  80.     
  81.     infoPtr->otherData[kLetterDescData] = nil;
  82.     infoPtr->otherData[kLastChangedData] = 0;
  83.     infoPtr->otherFlags[kMailerExpanded] = gPreferences.expandOnOpen;
  84.     infoPtr->data = nil;
  85.     infoPtr->otherData[kDSIGData] = nil;
  86.     
  87.     // adjust window inset area
  88.     
  89.     err = SMPGetDimensions(&mWidth,&contHeight,&expHeight);
  90.     if (err!=noErr)
  91.         DoError(err);
  92.     if (infoPtr->otherFlags[kMailerExpanded])
  93.         infoPtr->topIndent += expHeight;
  94.     else
  95.         infoPtr->topIndent += contHeight;
  96.  
  97.     // make scroll bars
  98.  
  99.     MakeScrollBars(theWindow,infoPtr);
  100.     
  101.     EndWindowAccess(theWindow,hState);
  102.     return theWindow;
  103. }
  104.  
  105.  
  106. /* set up the method pointers for the drawing mailer window class (may be called when a mailer
  107.    gets added/removed
  108. */
  109. void SetDMailerMethods(WInfoPtr infoPtr)
  110. {
  111.     infoPtr->m_idle = BaseIdleWindow;
  112.     infoPtr->m_fixCursor = DMailerFixCursorWindow;
  113.     infoPtr->m_activate = DMailerActivateWindow;
  114.     infoPtr->m_deactivate = DMailerDeactivateWindow;
  115.     infoPtr->m_update = DMailerUpdateWindow;
  116.     infoPtr->m_key = BaseKeyWindow;
  117.     infoPtr->m_resize = DrawResizeWindow;
  118.     infoPtr->m_click = DMailerClickWindow;
  119.     infoPtr->m_destroy = DMailerDestroyWindow;
  120.     infoPtr->m_undo = DMailerUndoWindow;
  121.     infoPtr->m_cut = DMailerCutWindow;
  122.     infoPtr->m_copy = DMailerCopyWindow;
  123.     infoPtr->m_paste = DMailerPasteWindow;
  124.     infoPtr->m_clear = DMailerClearWindow;
  125.     infoPtr->m_print = DMailerPrintWindow;
  126.     infoPtr->m_pageSetup = DMailerPageSetupWindow;
  127.     infoPtr->m_save = DMailerSaveWindow;
  128.     infoPtr->m_load = DMailerLoadWindow;
  129.     infoPtr->m_event = DMailerEventWindow;
  130.     infoPtr->m_ctrlHit = DrawHitControlWindow;
  131.     infoPtr->m_selectAll = DMailerSelectAllWindow;
  132.     infoPtr->m_group = DrawGroupWindow;
  133.     infoPtr->m_unGroup = DrawUnGroupWindow;
  134. }
  135.  
  136.  
  137. /* handle mouse-moved events for draw-mailer window */
  138.  
  139. void *DMailerFixCursorWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  140. {
  141.     RgnHandle returnRgn;
  142.     unsigned long *crsrData;
  143.     RgnHandle arrowRgn,pencilRgn,mailerRgn;
  144.     Point offsetPt,mousePt;
  145.     GrafPtr savePort;
  146.     Rect drawRect;
  147.     
  148.     GetPort(&savePort);
  149.     SetPort(window);
  150.         
  151.     crsrData = (unsigned long *)data;
  152.     returnRgn = (RgnHandle)crsrData[1];
  153.     mousePt = *(Point *)&crsrData[0];
  154.     arrowRgn = NewRgn();
  155.     pencilRgn = NewRgn();
  156.     mailerRgn = NewRgn();
  157.     
  158.     drawRect = window->portRect;
  159.     drawRect.bottom -= 15;
  160.     drawRect.right -= 15;
  161.     
  162.     SetRectRgn(arrowRgn,-32768,-32768,32767,32767);
  163.     RectRgn(pencilRgn,&drawRect);
  164.     SetPt(&offsetPt,0,0);
  165.     LocalToGlobal(&offsetPt);
  166.     OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
  167.     DiffRgn(arrowRgn,pencilRgn,arrowRgn);
  168.  
  169.     drawRect.top += infoPtr->topIndent;
  170.     RectRgn(pencilRgn,&drawRect);
  171.     OffsetRgn(pencilRgn,offsetPt.h,offsetPt.v);
  172.     drawRect.top -= infoPtr->topIndent;
  173.     drawRect.bottom = drawRect.top + infoPtr->topIndent;
  174.     RectRgn(mailerRgn,&drawRect);
  175.     OffsetRgn(mailerRgn,offsetPt.h,offsetPt.v);
  176.     
  177.     if (PtInRgn(mousePt,arrowRgn)) {
  178.         CopyRgn(arrowRgn,returnRgn);
  179.         SetCursor(&qd.arrow);
  180.     }
  181.     else if (PtInRgn(mousePt,pencilRgn)) {
  182.         CopyRgn(pencilRgn,returnRgn);
  183.         if (gCurrentShape!=kSelectShape)
  184.             SetCursor(&gPencilCursor);
  185.         else
  186.             SetCursor(&qd.arrow);
  187.     }
  188.     else if (PtInRgn(mousePt,mailerRgn)) {
  189.         CopyRgn(mailerRgn,returnRgn);
  190.     }
  191.  
  192.         
  193.     DisposeRgn(arrowRgn);
  194.     DisposeRgn(pencilRgn);
  195.     DisposeRgn(mailerRgn);
  196.     SetPort(savePort);
  197.     
  198.     return BaseFixCursorWindow(window,infoPtr,data);
  199. }
  200.  
  201.  
  202. /* handle mouse click in content for draw-mailer window */
  203.  
  204. void *DMailerClickWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  205. {
  206.     RgnHandle savedClip;
  207.     GrafPtr savePort;
  208.     void *returnVal;
  209.     OSErr err;
  210.     Boolean alreadyChanged;
  211.     
  212.     // make sure we can change the letter
  213.     
  214.     alreadyChanged = infoPtr->changed;
  215.     if (!alreadyChanged && (gCurrentShape!=kSelectShape)) {
  216.         err = SMPPrepareToChange(window);
  217.         if (err==userCanceledErr)
  218.             return nil;
  219.     }
  220.  
  221.     // since we're drawing a shape, clear any mailer undo buffer
  222.     err = SMPClearUndo(window);
  223.     if (err!=noErr)
  224.         DoError(err);
  225.     
  226.     // remove mailer from clip
  227.     GetPort(&savePort);    
  228.     SetPort(window);
  229.     savedClip = NewRgn();
  230.     GetClip(savedClip);
  231.     ClipToDrawing(window,infoPtr);
  232.     
  233.     // call drawing click method and maybe mark letter changed
  234.     returnVal = DrawClickWindow(window,infoPtr,data);
  235.     if (!alreadyChanged && infoPtr->changed) {
  236.         err = SMPContentChanged(window);
  237.         if (err!=noErr)
  238.             DoError(err);
  239.     }
  240.     
  241.     // restore clip
  242.     SetClip(savedClip);
  243.     DisposeRgn(savedClip);
  244.     SetPort(savePort);
  245.     return returnVal;
  246. }
  247.  
  248.  
  249. /* deallocate any memory associated with the draw-mailer window class */
  250.  
  251. void *DMailerDestroyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  252. {
  253.     OSErr err;
  254.     SMPCloseOptions *closeOptions,noCloseOptions;
  255.     
  256.     if (infoPtr->otherData[kLetterDescData])
  257.         DisposHandleChk((Handle)infoPtr->otherData[kLetterDescData]);
  258.     
  259.     if (gPreferences.closeOptionsDialog)
  260.         closeOptions = &gPreferences.closeOptions;
  261.     else {
  262.         noCloseOptions.moveToTrash = false;
  263.         noCloseOptions.addTag = false;
  264.         noCloseOptions.tag.dataLength = 0;
  265.         closeOptions = &noCloseOptions;
  266.     }
  267.     
  268.     err = SMPDisposeMailer(window,closeOptions);
  269.     if (err!=noErr)
  270.         DoError(err);
  271.     
  272.     return DrawDestroyWindow(window,infoPtr,data);
  273. }
  274.  
  275.  
  276. /* handle activate events for draw-mailer window */
  277.  
  278. void *DMailerActivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  279. {
  280.     #pragma unused (data)
  281.     MenuHandle theMenu;
  282.     
  283.     DisableAllMenus();
  284.     
  285.     theMenu = GetMHandle(kFileMenu);
  286.     EnableAllMenuItems(theMenu);
  287.     if (!infoPtr->changed)
  288.         DisableItem(theMenu, kSaveItem);
  289.     
  290.     theMenu = GetMHandle(kShapesMenu);
  291.     EnableAllMenuItems(theMenu);
  292.     theMenu = GetMHandle(kSignMenu);
  293.     EnableAllMenuItems(theMenu);
  294.             
  295.     FixMailerMenus(window,infoPtr);    // fixes up file,edit,mail menu
  296.  
  297.     gMenusDirty = true;
  298.     
  299.     HiliteControl(VSCROLL,0);
  300.     HiliteControl(HSCROLL,0);
  301.     MyDrawGrowIcon(window);
  302.     
  303.     return nil;
  304. }
  305.  
  306.  
  307. /* handle deactivate events for draw-mailer window */
  308.  
  309. void *DMailerDeactivateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  310. {
  311.     #pragma unused (data)
  312.     MenuHandle theMenu;
  313.     Str255 addMailerText;
  314.         
  315.     HiliteControl(VSCROLL,254);
  316.     HiliteControl(HSCROLL,254);
  317.     MyDrawGrowIcon(window);
  318.  
  319.     theMenu = GetMHandle(kMailMenu);
  320.     GetResString(addMailerText,kAddMailerTextID,kAddMailerText);
  321.     SetItem(theMenu,kAddRemMailItem,addMailerText);
  322.  
  323.     SetDefaultMenus();
  324.     gMenusDirty = true;
  325.     return nil;
  326. }
  327.  
  328.  
  329. /* handle update events for draw-mailer window */
  330.  
  331. void *DMailerUpdateWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  332. {
  333.     RgnHandle savedClip;
  334.     
  335.     savedClip = NewRgn();
  336.     GetClip(savedClip);
  337.     ClipToDrawing(window,infoPtr);
  338.     
  339.     DrawUpdateWindow(window,infoPtr,data);
  340.     
  341.     SetClip(savedClip);
  342.     DisposeRgn(savedClip);
  343.     
  344.     return nil;
  345. }
  346.  
  347.  
  348. /* handle generic event for draw-mailer window by passing the event to AOCE */
  349.  
  350. void *DMailerEventWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  351. {
  352.     SMPMailerResult whatHappened;
  353.     EventRecord *ev;
  354.     OSErr err;
  355.     
  356.     ev = (EventRecord *)data;
  357.     
  358.     err = SMPMailerEvent(ev,&whatHappened,nil,0L);    // call AOCE with the event
  359.     if (err!=noErr) {
  360.         DoError(err);
  361.     }
  362.             
  363.     return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  364. }
  365.  
  366.  
  367. /* handle undo for draw-mailer window */
  368.  
  369. void *DMailerUndoWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  370. {
  371.     OSErr err;
  372.     SMPMailerResult whatHappened;
  373.     
  374.     err = SMPMailerEditCommand(window,kSMPUndoCommand,&whatHappened);
  375.     if (err!=noErr)
  376.         DoError(err);
  377.     
  378.     if (!ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened)) {
  379.         err = SMPBecomeTarget(window,false,0);
  380.         // ignore errors here- we may already be the target
  381.         DrawUndoWindow(window,infoPtr,data);
  382.     }
  383.     
  384.     return nil;
  385. }
  386.  
  387.  
  388. /* handle cut for draw-mailer window */
  389.  
  390. void *DMailerCutWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  391. {
  392.     #pragma unused (data)
  393.     OSErr err;
  394.     SMPMailerResult whatHappened;
  395.     
  396.     err = SMPMailerEditCommand(window,kSMPCutCommand,&whatHappened);
  397.     if (err!=noErr)
  398.         DoError(err);
  399.         
  400.     return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  401. }
  402.  
  403.  
  404. /* handle copy for draw-mailer window */
  405.  
  406. void *DMailerCopyWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  407. {
  408.     #pragma unused (data)
  409.     OSErr err;
  410.     SMPMailerResult whatHappened;
  411.     
  412.     err = SMPMailerEditCommand(window,kSMPCopyCommand,&whatHappened);
  413.     if (err!=noErr)
  414.         DoError(err);
  415.         
  416.     return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  417. }
  418.  
  419.  
  420. /* handle paste for draw-mailer window */
  421.  
  422. void *DMailerPasteWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  423. {
  424.     #pragma unused (data)
  425.     OSErr err;
  426.     SMPMailerResult whatHappened;
  427.     
  428.     err = SMPMailerEditCommand(window,kSMPPasteCommand,&whatHappened);
  429.     if (err!=noErr)
  430.         DoError(err);
  431.         
  432.     return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  433. }
  434.  
  435.  
  436. /* handle clear for draw-mailer window */
  437.  
  438. void *DMailerClearWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  439. {
  440.     #pragma unused (data)
  441.     OSErr err;
  442.     SMPMailerResult whatHappened;
  443.     
  444.     err = SMPMailerEditCommand(window,kSMPClearCommand,&whatHappened);
  445.     if (err!=noErr)
  446.         DoError(err);
  447.         
  448.     return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  449. }
  450.  
  451.  
  452. /* handle select all for draw-mailer window */
  453.  
  454. void *DMailerSelectAllWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  455. {
  456.     OSErr err;
  457.     SMPMailerResult whatHappened;
  458.     SMPMailerState mailerState;
  459.     
  460.     err = SMPGetMailerState(window,&mailerState);
  461.     if (err!=noErr)
  462.         DoError(err);
  463.     
  464.     if (mailerState.isTarget) {
  465.         err = SMPMailerEditCommand(window,kSMPSelectAllCommand,&whatHappened);
  466.         if (err!=noErr)
  467.             DoError(err);
  468.         return (void *)(ProcessPowerTalkWhatHappened(window,infoPtr,whatHappened));
  469.     }
  470.     else {
  471.         DrawSelectAllWindow(window,infoPtr,data);
  472.     }
  473.     return nil;    
  474. }
  475.  
  476.  
  477. /* handle print for draw-mailer window */
  478.  
  479. void *DMailerPrintWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  480. {
  481.     #pragma unused (data)
  482.     OSErr err;
  483.     short pageCount,curPage;
  484.     Boolean shouldContinue;
  485.     TPPrPort thePrPort;
  486.     TPrStatus theStatus;
  487.     Point zeroOffset = {0,0};
  488.     
  489.     // open print driver
  490.     
  491.     PrOpen();
  492.     if (PrError()!=noErr) {
  493.         DoError(PrError());
  494.         return nil;
  495.     }
  496.     
  497.     // display print dialog
  498.     
  499.     shouldContinue = PrJobDialog(infoPtr->printRecord);
  500.     if (PrError()!=noErr) {
  501.         DoError(PrError());
  502.         return nil;
  503.     }
  504.     if (!shouldContinue)
  505.         return nil;
  506.     
  507.     // init printing grafport
  508.     
  509.     thePrPort = PrOpenDoc(infoPtr->printRecord,nil,nil);
  510.     if (PrError()==noErr) {
  511.         err = SMPPrepareCoverPages(window,&pageCount);
  512.         if (err!=noErr)
  513.             DoError(err);
  514.         for (curPage=1;curPage<=pageCount;curPage++) {
  515.             PrOpenPage(thePrPort,nil);
  516.             if (PrError()==noErr)
  517.                 err = SMPDrawNthCoverPage(window,curPage,(curPage==pageCount));
  518.                 if (err!=noErr)
  519.                     DoError(err);
  520.             PrClosePage(thePrPort);
  521.         
  522.         }
  523.         
  524.         PrOpenPage(thePrPort,nil);
  525.         DrawAllShapes(infoPtr,zeroOffset);
  526.         PrClosePage(thePrPort);
  527.     }
  528.     PrCloseDoc(thePrPort);
  529.     
  530.     if ((((TPPrint)*(infoPtr->printRecord))->prJob.bJDocLoop == bSpoolLoop)&&(PrError() == noErr))
  531.         PrPicFile(infoPtr->printRecord, nil, nil, nil, &theStatus);                
  532.  
  533.     // close print driver
  534.     
  535.     PrClose();
  536.     
  537.     return nil;
  538. }
  539.  
  540.  
  541. /* handle page setup for draw-mailer window */
  542.  
  543. void *DMailerPageSetupWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  544. {
  545.     OSErr err;
  546.     
  547.     // make sure we can change the content of the letter
  548.     
  549.     err = SMPPrepareToChange(window);
  550.     if (err!=noErr) {
  551.         DoError(err);
  552.         return nil;
  553.     }
  554.     // we have changed the content of the letter, so notify the mailer
  555.     
  556.     err = SMPContentChanged(window);
  557.     if (err!=noErr) {
  558.         DoError(err);
  559.         return nil;
  560.     }
  561.     
  562.     return DrawPageSetupWindow(window,infoPtr,data);
  563. }
  564.  
  565.  
  566. /* handle load for draw-mailer window (grabs main enclosure and calls drawing class load) */
  567.  
  568. void *DMailerLoadWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  569. {
  570.     OSErr err;
  571.     LetterDescriptor *letterDesc;
  572.     Point upLeft = {0,0};
  573.     FSSpec enclSpec;
  574.     Handle letterDescHndl;
  575.     extern void DoContentStuff(WindowPtr window);
  576.  
  577.     letterDescHndl = NewHandleChk(sizeof(LetterDescriptor));
  578.     if (MemError()!=noErr) {
  579.         DoError(MemError());
  580.         return nil;
  581.     }
  582.     
  583.     letterDesc = (LetterDescriptor *)data;
  584.     BlockMove(letterDesc,*letterDescHndl,sizeof(LetterDescriptor));
  585.     if (infoPtr->otherData[kLetterDescData])
  586.         DoError(kInternalError);
  587.     infoPtr->otherData[kLetterDescData] = letterDescHndl;
  588.     
  589.     err = SMPOpenLetter(letterDesc,window,upLeft,true,gPreferences.expandOnOpen,nil,0L);
  590.     if (err!=noErr) {
  591.         DoError(err);
  592.         return nil;
  593.     }
  594.     
  595.     err = SMPGetMainEnclosureFSSpec(window,&enclSpec);
  596.     if (err!=noErr) {
  597.         DoError(err);
  598.         return nil;
  599.     }
  600.     
  601.     return DrawLoadWindow(window,infoPtr,&enclSpec);
  602. }
  603.  
  604.  
  605. /* handle save for draw-mailer window (calls thru to LoSaveLetter) */
  606.  
  607. void *DMailerSaveWindow(WindowPtr window,WInfoPtr infoPtr,void *data)
  608. {
  609.     OSErr err;
  610.     
  611.     err = LoSaveLetter(window,infoPtr,(SMPSaveType)data);
  612.     if (err!=noErr) {
  613.         DoError(err);
  614.         return nil;
  615.     }
  616.     
  617.     SetWTitle(window,infoPtr->fileSpec.name);
  618.     return BaseSaveWindow(window,infoPtr,data);
  619. }
  620.